<?php


namespace App\Helpers;


class Utils
{
    /**
     * 将字符转为Unicode编码
     * @param $str
     * @param $index
     * @return mixed|null
     */
    public function unicodeEncode($str, $index)
    {
        $char = mb_substr($str, $index, 1, 'UTF-8');
        if (mb_check_encoding($char, 'UTF-8')) {
            $ret = mb_convert_encoding($char, "UCS-4BE");
            $ret = unpack("N", $ret);
            $code = $ret[1];                                // Unicode编码的十进制
            // $code = dechex($code);                         // 标准的Unicode编码
            return $code;
        } else {
            return null;
        }
    }

    /**
     * 将Unicode编码转为字符
     * @param $num
     * @return string
     */
    public function unicodeDecode($num) {
        // 将数字转16进制
        $num = dechex($num);
        $str = '\u00' . $num;
        $json = '{"str":"' . $str . '"}';
        $arr = json_decode($json, true);
        if (empty($arr)) return '';
        return $arr['str'];
    }

    /**
     * 模拟js的 >>>
     * @param $v
     * @param $n
     * @return int
     */
    public function rrr($v, $n)
    {
        return ($v & 0xFFFFFFFF) >> ($n & 0x1F);
    }

    /**
     * 模拟js的 >>
     * @param $v
     * @param $n
     * @return int
     */
    public function rr($v, $n)
    {
        $v = $v & 0x80000000 ? $v | 0xFFFFFFFF00000000 : $v & 0xFFFFFFFF;

        return $v >> ($n & 0x1F);
    }

    /**
     * 模拟js的 <<
     * @param $v
     * @param $n
     * @return int
     */
    public function ll($v, $n)
    {
        $t = ($v & 0xFFFFFFFF) << ($n & 0x1F);

        return $t & 0x80000000 ? $t | 0xFFFFFFFF00000000 : $t & 0xFFFFFFFF;
    }

}
